home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
m2
/
cat3src
/
magic
/
i
/
mtrsc.i
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
Macintosh to JP
MacRoman (detected)
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
Modula Implementation
|
1997-10-26
|
62.9 KB
|
2,008 lines
IMPLEMENTATION MODULE mtRsc;
(****************************************************************************
*
* Beschreibung : Dieses Modul ersetzt mtRsc aus der Magic-Lib.
* Die Aufrufe sind identisch, es handelt sich aber um
* ein 'Portierung' der Farb-Rsc-Untersttzung von
* Interface.
*
* Daraus ergibt sich auch der konfuse und schlecht
* lesbare Quelltext, da die Originale in typischer
* C-Manier geschrieben sind.
*
* $Source: c:\gemini\user\s_engel\RCS\MTRSC.M,v $
*
* $Revision: 1.4 $
*
* $Author: S_Engel $
*
* $Date: 1995/05/09 14:30:44 $
*
* $State: Exp $
*
*****************************************************************************
* History:
*
* $Log: MTRSC.M,v $
* Revision 1.4 1995/05/09 14:30:44 S_Engel
* Farbicons funktionieren endlich unter True Color
*
* Revision 1.3 1995/05/08 13:08:10 S_Engel
* Implementierung von GetRscHeader
*
* Revision 1.2 1995/03/25 15:47:46 S_Engel
* Bei Auflsungen ber 8 Bit werden keine Farbicons benutzt.
*
* Revision 1.1 1995/01/01 19:04:14 S_Engel
* Initial revision
*
*
*
****************************************************************************)
FROM Portab IMPORT tCompiler, Compiler;
(*$?Compiler=Haenisch:
(*----------------------------------------------*)
(* *)
(*$S- Stack-Checks *)
(*$I- keine Variablen-Initialisierung *)
(*$V- keine arithmetischen Kontrollen *)
(*$T- kein Bereichstest *)
(* *)
(*----------------------------------------------*)
*)
(*$?Compiler=Megamax:
(*----------------------------------------------*)
(* *)
(* S- Stack-Checks *)
(*$R- kein Bereichstest *)
(*$K+ kein Bereichstest *)
(* *)
(*----------------------------------------------*)
*)
IMPORT SYSTEM, Storage;
FROM SYSTEM IMPORT ADR, ADDRESS, TSIZE;
(* HM2-Spezifika *)
IMPORT Block;
FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
CastToChar, CastToByte, CastToByteset, CastToInt,
CastToCard, CastToBitset, CastToWord, CastToLInt,
CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
TosVersion, Accessory, Basepage, SysHeader, TosDate;
IMPORT MagicBitOps, MagicVDI, MagicStrings, MagicDOS, MagicAES, MagicTypes;
IMPORT mtAppl, mtUtils, mtXobjects;
(*$?Compiler=Haenisch:
IMPORT void;
*)
(*$?Compiler=Megamax:
IMPORT mtVoid; (* Dirk hat das anders *)
*)
TYPE tpRSHDR = POINTER TO MagicTypes.RSHDR;
tpRSXHDR = POINTER TO RSXHDR;
(*
RSXHDR = RECORD
rshVrsn : sCARDINAL; (* 3 fr langen Header *)
rshExtvrsn : sCARDINAL; (* 'IN' bei RSC von Interface *)
rshObject : lCARDINAL;
rshTedinfo : lCARDINAL;
rshIconblk : lCARDINAL;
rshBitblk : lCARDINAL;
rshFrstr : lCARDINAL;
rshString : lCARDINAL;
rshImdata : lCARDINAL;
rshFrimg : lCARDINAL;
rshTrindex : lCARDINAL;
rshNobs : lCARDINAL;
rshNtree : lCARDINAL;
rshNted : lCARDINAL;
rshNib : lCARDINAL;
rshNbb : lCARDINAL;
rshNstring : lCARDINAL;
rshNimages : lCARDINAL;
rshRssize : lCARDINAL;
END;
*)
(* Pufferstruktur fr Meisiek-Technik *)
tpRsBuffer = POINTER TO tRsBuffer;
tRsBuffer = RECORD
colictab : POINTER TO ARRAY[0..MAX(sINTEGER)] OF MagicAES.CICON;
colicons : sCARDINAL;
tree : POINTER TO ARRAY[0..MAX(sINTEGER)] OF mtUtils.tObjcTree;
xhdr : tpRSXHDR;
size : sCARDINAL;
rscdata : tpRSHDR;
Reserved : ARRAY[0..2] OF sCARDINAL;
END;
RESOURCE = POINTER TO Resource;
Resource = RECORD
RsBuffer : tRsBuffer;
next : RESOURCE;
last : RESOURCE;
END;
tpExtSlot = POINTER TO tExtSlot;
tExtSlot = RECORD
rscLen : lCARDINAL;
rscCIconTab : ADDRESS;
rscFarbtbl : ADDRESS;
END;
TYPE tplInt = POINTER TO ARRAY[0..MAX(sINTEGER)] OF lINTEGER;
tpsInt = POINTER TO ARRAY[0..MAX(sINTEGER)] OF sINTEGER;
tplCard = POINTER TO ARRAY[0..MAX(sINTEGER)] OF lCARDINAL;
tpsCard = POINTER TO ARRAY[0..MAX(sINTEGER)] OF sCARDINAL;
VAR RscList: RESOURCE;
(****** VARIABLES ************************************************************)
VAR xgl_wbox, xgl_hbox : sINTEGER;
(* rs_par sollte man evtl. durch Zugriff auf Resource.RsBuffer
* ersetzen *)
VAR rs_par : POINTER TO tRsBuffer;
TYPE table32 = ARRAY[0..255] OF ARRAY[0..31] OF sINTEGER;
table4 = ARRAY[0..255] OF ARRAY[0..3] OF sINTEGER;
VAR farbtbl : POINTER TO table32;
rgb_palette : POINTER TO table4;
farbtbl2 : ARRAY[0..255] OF SYSTEM.BYTE;
is_palette : BOOLEAN;
xpixelbytes : sINTEGER;
PROCEDURE SHIFT (val : sINTEGER; bits : sINTEGER) : sINTEGER;
(*$? Compiler=Megamax:
TYPE sBITNUMSET = SET OF SYSTEM.BITNUM[0..15];
*)
VAR v: sINTEGER;
BEGIN
(*$? Compiler=Haenisch:
RETURN sINTEGER(SYSTEM.SHIFT(sBITSET(val), bits));
*)
(*$? Compiler=Megamax:
RETURN sINTEGER(SYSTEM.SHIFT (sBITNUMSET (val), bits));
*)
END SHIFT;
PROCEDURE get_sub (index : sINTEGER; offset : lINTEGER; size : sCARDINAL) : SYSTEM.ADDRESS;
BEGIN
RETURN SYSTEM.ADDRESS(rs_par^.rscdata)
+ SYSTEM.ADDRESS(offset)
+ (VAL(lCARDINAL, index) * VAL(lCARDINAL, size));
END get_sub;
PROCEDURE get_address (type : sINTEGER; index : sINTEGER) : SYSTEM.ADDRESS;
VAR the_addr : SYSTEM.ADDRESS;
all_ptr : RECORD
CASE : sCARDINAL OF
| 0 : dummy : SYSTEM.ADDRESS;
| 1 : string : MagicAES.PtrSTRING;
| 2 : dpobject : POINTER TO ARRAY[0..MAX(sINTEGER)] OF mtUtils.tObjcTree;
| 3 : object : POINTER TO MagicAES.OBJECT;
| 4 : tedinfo : MagicAES.PtrTEDINFO;
| 5 : iconblk : MagicAES.PtrICONBLK;
| 6 : bitblk : MagicAES.PtrBITBLK;
ELSE
addr : POINTER TO SYSTEM.ADDRESS;
END;
END;
BEGIN
the_addr := NIL;
CASE type OF
|MagicAES.RTREE:
all_ptr.dpobject := SYSTEM.ADDRESS(rs_par^.tree);
the_addr := all_ptr.dpobject^[index];
|MagicAES.ROBJECT:
the_addr := get_sub (index, rs_par^.xhdr^.rshObject, SYSTEM.TSIZE(MagicAES.OBJECT));
|MagicAES.RTEDINFO,
MagicAES.RTEPTEXT:
the_addr := get_sub (index, rs_par^.xhdr^.rshTedinfo, SYSTEM.TSIZE(MagicAES.TEDINFO));
|MagicAES.RICONBLK,
MagicAES.RIBPMASK:
the_addr := get_sub (index, rs_par^.xhdr^.rshIconblk, SYSTEM.TSIZE(MagicAES.ICONBLK));
|MagicAES.RBITBLK,
MagicAES.RBIDATA:
the_addr := get_sub (index, rs_par^.xhdr^.rshBitblk, SYSTEM.TSIZE(MagicAES.BITBLK));
|MagicAES.ROBSPEC:
all_ptr.object := get_address(MagicAES.ROBJECT, index);
the_addr := SYSTEM.ADR(all_ptr.object^.obSpec);
|MagicAES.RTEPVALID,
MagicAES.RTEPTMPLT:
all_ptr.tedinfo := get_address(MagicAES.RTEDINFO, index);
IF (type = MagicAES.RTEPVALID)
THEN
the_addr := SYSTEM.ADR(all_ptr.tedinfo^.tePvalid);
ELSE
the_addr := SYSTEM.ADR(all_ptr.tedinfo^.tePtmplt);
END;
|MagicAES.RIBPDATA,
MagicAES.RIBPTEXT:
all_ptr.iconblk := get_address(MagicAES.RICONBLK, index);
IF (type = MagicAES.RIBPDATA)
THEN
the_addr := SYSTEM.ADR(all_ptr.iconblk^.ibPdata);
ELSE
the_addr := SYSTEM.ADR(all_ptr.iconblk^.ibPtext);
END;
|MagicAES.RSTRING:
all_ptr.addr := get_sub (index, rs_par^.xhdr^.rshFrstr, SYSTEM.TSIZE(MagicAES.PtrSTRING));
(* Zeiger auf den String aus der Tabelle *)
the_addr := all_ptr.addr^;
|MagicAES.RIMAGEDATA:
all_ptr.addr := get_sub (index, rs_par^.xhdr^.rshImdata, SYSTEM.TSIZE(MagicAES.PtrSTRING));
the_addr := all_ptr.addr^;
|MagicAES.RFRIMG:
the_addr := get_sub (index, rs_par^.xhdr^.rshFrimg, SYSTEM.TSIZE(MagicAES.PtrSTRING));
|MagicAES.RFRSTR:
(* Zeiger auf den Zeiger *)
the_addr := get_sub (index, rs_par^.xhdr^.rshFrstr, SYSTEM.TSIZE(MagicAES.PtrSTRING));
ELSE
END; (* CASE *)
RETURN the_addr;
END get_address;
PROCEDURE rs_obfix (rs_otree : mtUtils.tObjcTree; rs_oobject : sINTEGER);
PROCEDURE fix_coord (VAR pcoord : sINTEGER; vertical : BOOLEAN; fixed: BOOLEAN);
VAR ncoord : sINTEGER;
BEGIN
(* Was'n das fr'n Schei? *)
ncoord := pcoord MOD 256;
IF vertical
THEN
IF fixed
THEN
ncoord := ncoord * 16;
ELSE
ncoord := ncoord * xgl_hbox;
END;
ELSIF (ncoord = 80)
THEN
ncoord := mtAppl.MaxWidth; (* Breite des Bildschirms in Pixel *)
ELSE
IF fixed
THEN
ncoord := ncoord * 8;
ELSE
ncoord := ncoord * xgl_wbox;
END;
(* xgl_wbox, xgl_hbox = Zeichenbreite, Zeichenhhe in Pixel *)
END;
IF Bit15 IN sBITSET(pcoord)
THEN
ncoord := ncoord + (( pcoord DIV 256) MOD 256) + sINTEGER(0FF00H);
ELSE
ncoord := ncoord + (( pcoord DIV 256) MOD 256);
END;
pcoord := ncoord;
END fix_coord;
VAR coord : POINTER TO ARRAY[0..3] OF sINTEGER;
vertical : BOOLEAN;
count : sINTEGER;
fixed : BOOLEAN;
BEGIN
vertical := FALSE;
fixed := mtUtils.InFlag (rs_otree, rs_oobject, 13);
coord := SYSTEM.ADR(rs_otree^[rs_oobject].obX);
FOR count := 0 TO 3 DO
fix_coord(coord^[count], vertical, fixed);
vertical := ~vertical;
END;
END rs_obfix;
PROCEDURE fix_long (VAR lptr : SYSTEM.ADDRESS) : BOOLEAN;
BEGIN
IF (lptr = NIL)
THEN
RETURN FALSE;
END;
lptr := lptr + rs_par^.rscdata;
RETURN TRUE;
END fix_long;
PROCEDURE fix_object;
VAR count, type : sINTEGER;
obj : POINTER TO MagicAES.OBJECT;
BEGIN
count := VAL(sINTEGER, rs_par^.xhdr^.rshNobs) - 1;
WHILE (count >= 0) DO
obj := get_address (MagicAES.ROBJECT, count);
rs_obfix (mtUtils.tObjcTree(obj), 0);
type := obj^.obType MOD 256;
IF (type # MagicAES.GBOX)
AND (type # MagicAES.GIBOX)
AND (type # MagicAES.GBOXCHAR)
THEN
void.O := fix_long (obj^.obSpec.address);
END;
DEC(count);
END; (* WHILE *)
END fix_object;
PROCEDURE rs_fixindex (VAR global : tRsBuffer);
BEGIN
rs_par := SYSTEM.ADR(global);
fix_object ();
END rs_fixindex;
PROCEDURE do_rsfix (size : lCARDINAL);
PROCEDURE fix_treeindex();
VAR count : lINTEGER;
adr : POINTER TO ARRAY[0..MAX(sINTEGER)] OF mtUtils.tObjcTree;
BEGIN
count := rs_par^.xhdr^.rshNtree - 1;
adr := get_sub (0, rs_par^.xhdr^.rshTrindex, SYSTEM.TSIZE(SYSTEM.ADDRESS));
rs_par^.tree := SYSTEM.ADDRESS(adr);
WHILE (count >= 0) DO
void.O := fix_long (adr^[VAL(SHORTINT, count)]);
DEC(count);
END;
END fix_treeindex;
PROCEDURE fix_ptr (type : sINTEGER; index : lINTEGER) : BOOLEAN;
VAR adr : POINTER TO SYSTEM.ADDRESS;
BEGIN
adr := get_address (type, VAL(SHORTINT, index));
RETURN fix_long (adr^);
END fix_ptr;
PROCEDURE fix_tedinfo();
VAR count : sINTEGER;
VAR
tedinfo : MagicAES.PtrTEDINFO;
BEGIN
count := VAL (sINTEGER, rs_par^.xhdr^.rshNted) - 1;
WHILE (count >= 0) DO
tedinfo := get_address (MagicAES.RTEDINFO, count);
IF (fix_ptr (MagicAES.RTEPTEXT, count))
THEN
tedinfo^.teTxtlen := LENGTH(tedinfo^.tePtext^) + 1;
END;
IF (fix_ptr (MagicAES.RTEPTMPLT, count))
THEN
tedinfo^.teTmplen := LENGTH(tedinfo^.tePtmplt^) + 1;
END;
void.O := fix_ptr (MagicAES.RTEPVALID, count);
DEC(count);
END;
END fix_tedinfo;
PROCEDURE fix_nptr (index : lINTEGER; ob_type : sINTEGER);
VAR adr : POINTER TO SYSTEM.ADDRESS;
BEGIN
WHILE (index >= 0) DO
adr := get_address(ob_type, VAL( sINTEGER, index));
void.O := fix_long (adr^);
DEC(index);
END;
END fix_nptr;
BEGIN
rs_par^.size := size;
(* Zeiger auf die Daten eintragen *)
rs_par^.rscdata := rs_par^.rscdata;
fix_treeindex ();
fix_tedinfo ();
WITH rs_par^.xhdr^ DO
fix_nptr (rshNib - 1, MagicAES.RIBPMASK);
fix_nptr (rshNib - 1, MagicAES.RIBPDATA);
fix_nptr (rshNib - 1, MagicAES.RIBPTEXT);
fix_nptr (rshNbb - 1, MagicAES.RBIDATA);
fix_nptr (rshNstring - 1, MagicAES.RFRSTR);
fix_nptr (rshNimages - 1, MagicAES.RFRIMG);
END;
END do_rsfix;
PROCEDURE fill_cicon_liste (cicon_liste : tplInt;
header : lCARDINAL;
rsxhdr : tpRSXHDR) : sINTEGER;
VAR i, i2, num : sINTEGER;
iclen, num_cicon, ob : lCARDINAL;
p : SYSTEM.ADDRESS;
cblk : MagicAES.PtrCICONBLK;
cicon, cold : MagicAES.PtrCICON;
pobject : mtUtils.tObjcTree;
BEGIN
num := 0;
WHILE (cicon_liste^[num] = 0) DO
INC(num);
END;
IF (cicon_liste^[num] # -1)
THEN
RETURN 0;
END;
cblk := MagicAES.PtrCICONBLK(ADR(cicon_liste^[num+1])); (* AUA!! *)
FOR i := 0 TO num - 1 DO
cicon_liste^[i] := lINTEGER(cblk);
p := (cblk) + ADDRESS(TSIZE(MagicAES.CICONBLK));
cblk^.mono.ibPdata := p;
iclen := (cblk^.mono.ibWicon DIV 8) * cblk^.mono.ibHicon;
p := p + ADDRESS(iclen);
cblk^.mono.ibPmask := p;
p := p + ADDRESS(iclen);
(* Das erscheint mit so falsch zu sein (SE) *)
(* IF (p2 # NIL)*)
(* OR (header + p2 = p)*)
(* OR (p2 < rsxhdr^.rshString)*)
(* OR (p2 > rsxhdr^.rshRssize)*)
IF (cblk^.mono.ibPtext = NIL)
THEN
cblk^.mono.ibPtext := ADDRESS(p);
ELSE
cblk^.mono.ibPtext := header + ADDRESS(cblk^.mono.ibPtext);
END;
p := p + ADDRESS(12);
cicon := MagicAES.PtrCICON(p);
cold := cicon;
num_cicon := lINTEGER(cblk^.color);
IF num_cicon > 0
THEN
cblk^.color := cicon;
FOR i2 := 0 TO VAL (sINTEGER, num_cicon) - 1 DO
p := (cicon) + ADDRESS(TSIZE(MagicAES.CICON));
cicon^.coldata := p;
p := p + ADDRESS(iclen * VAL(lCARDINAL, cicon^.numplanes));
cicon^.colmask := p;
p := p + ADDRESS(iclen);
IF cicon^.seldata # NIL
THEN
cicon^.seldata := p;
p := p + ADDRESS(iclen * VAL(lCARDINAL, cicon^.numplanes));
cicon^.selmask := p;
p := p + ADDRESS(iclen);
END;
cicon^.nextres := MagicAES.PtrCICON(p);
cold := cicon;
cicon := MagicAES.PtrCICON(p);
END;
cold^.nextres := NIL;
END;
cblk := MagicAES.PtrCICONBLK(p);
END; (* FOR *)
IF (num # 0)
THEN
pobject := header + ADDRESS(rsxhdr^.rshObject);
FOR ob := 0 TO rsxhdr^.rshNobs - 1 DO
IF ((pobject^[ob].obType MOD 256) = MagicAES.GCICON)
THEN
pobject^[ob].obSpec.address := ADDRESS(cicon_liste^[lINTEGER(pobject^[ob].obSpec)]);
END;
END;
Storage.ALLOCATE(rs_par^.colictab, num * SYSTEM.TSIZE(MagicAES.CICON));
IF rs_par^.colictab # NIL
THEN
Block.Clear(rs_par^.colictab, num * SYSTEM.TSIZE(MagicAES.CICON));
END;
rs_par^.colicons := num;
END;
RETURN num;
END fill_cicon_liste;
(*****************************************************************************)
(* Testen wieviel Bytes pro Pixel im gerteabhngigen Format verwendet werden*)
(*****************************************************************************)
(*$? Compiler = Megamax:
PROCEDURE xfix_cicon (col_data : ADDRESS; len : lINTEGER; old_planes, new_planes : sINTEGER; VAR s : MagicVDI.MFDB);FORWARD;
PROCEDURE std_to_byte (col_data : ADDRESS; len : lINTEGER; old_planes : sINTEGER; farbtbl2 : tplInt; s : MagicVDI.MFDB);FORWARD;
PROCEDURE draw_bitblk (p : ADDRESS; x, y, w, h : sINTEGER; num_planes : sINTEGER; mode : sINTEGER; VAR index : ARRAY OF sINTEGER);FORWARD;
PROCEDURE xdraw_cicon (pb : MagicAES.PtrPARMBLK) : sBITSET; FORWARD;
*)
(*****************************************************************************)
(* Icon ins gerteabhngige Format wandeln und ggf an andere Auflsungen *)
(* anpassen *)
(*****************************************************************************)
PROCEDURE xadd_cicon (cicnblk : MagicAES.PtrCICONBLK; VAR obj : MagicAES.OBJECT; nub : sINTEGER) : BOOLEAN;
VAR x, y, line, xmax, best_planes, find_planes: sINTEGER;
cicn, color_icn, best_icn : MagicAES.PtrCICON;
len : lCARDINAL;
next : POINTER TO lCARDINAL;
d : MagicVDI.MFDB;
selMask,
colMask : POINTER TO ARRAY [0..0FFFFH] OF sBITSET;
BEGIN
best_icn := NIL;
len := (cicnblk^.mono.ibWicon DIV 8) * cicnblk^.mono.ibHicon;
color_icn := ADR(rs_par^.colictab^[nub]);
best_planes := 1;
IF (mtAppl.Bitplanes > 8)
THEN
find_planes := 4;
ELSE
find_planes := mtAppl.Bitplanes;
END;
cicn := cicnblk^.color;
next := ADR(cicnblk^.color);
WHILE (cicn # NIL) DO
next^ := LONGCARD (cicn); (* *next = (LONG)cicn; *)
next := ADR(cicn^.nextres);
IF (cicn^.numplanes >= best_planes) & (cicn^.numplanes <= find_planes)
THEN
best_planes := cicn^.numplanes;
best_icn := cicn;
END;
cicn := cicn^.nextres;
END;
IF (best_icn = NIL) (* kein passendes Farbicon gefunden *)
THEN
RETURN FALSE;
ELSE
color_icn^ := best_icn^;
END;
IF (best_planes > 1)
THEN
color_icn^.numplanes := mtAppl.Bitplanes;
ELSE
color_icn^.numplanes := 1;
END;
(* Platz fr das gerteabhngige Format allozieren *)
Storage.ALLOCATE (color_icn^.coldata, len * VAL(lCARDINAL, color_icn^.numplanes));
IF color_icn^.coldata = NIL
THEN
RETURN FALSE
END;
IF color_icn^.seldata # NIL
THEN
Storage.ALLOCATE (color_icn^.seldata, len * VAL(lCARDINAL, color_icn^.numplanes));
IF color_icn^.seldata = NIL
THEN
Storage.DEALLOCATE (color_icn^.coldata, 0);
RETURN FALSE
END;
END;
IF (best_planes > 1)
THEN
IF (best_icn^.seldata = NIL)
THEN
(* Selected-Maske vorbereiten *)
Storage.ALLOCATE (color_icn^.selmask, len);
IF color_icn^.selmask = NIL
THEN
Storage.DEALLOCATE (color_icn^.coldata, 0);
IF color_icn^.seldata # NIL
THEN
Storage.DEALLOCATE (color_icn^.seldata, 0);
END;
RETURN FALSE;
END;
xmax := cicnblk^.mono.ibWicon DIV 16;
selMask := color_icn^.selmask;
colMask := best_icn^.colmask;
FOR y := 0 TO cicnblk^.mono.ibHicon - 1 DO
line := y * xmax;
FOR x := 0 TO xmax -1 DO
IF y MOD 2 # 0
THEN
selMask^[line+x] := colMask^[line+x] * sBITSET(0AAAAH);
ELSE
selMask^[line+x] := colMask^[line+x] * sBITSET(05555H);
END;
END; (* FOR *)
END(*FOR*);
ELSE
(* Wir mssen die selmask allozieren, da sonst
* bei FreeRsc ein unbekannter Block freigegeben
* wird.
*)
Storage.ALLOCATE (color_icn^.selmask, len);
(*$?Compiler=Haenisch:
Block.Move (best_icn^.selmask, color_icn^.selmask, len);
*)
(*$?Compiler=Megamax:
Block.Copy (best_icn^.selmask, len, color_icn^.selmask);
*)
END(*IF*);
WITH d DO
fdAddr := color_icn^.coldata;
fdW := cicnblk^.mono.ibWicon;
fdH := cicnblk^.mono.ibHicon;
fdWdwidth := fdW DIV 16;
fdStand := 1;
fdNplanes := mtAppl.Bitplanes;
END;
xfix_cicon (best_icn^.coldata, len, best_planes, mtAppl.Bitplanes, d);
IF (best_icn^.seldata # NIL)
THEN
d.fdAddr := color_icn^.seldata;
xfix_cicon (best_icn^.seldata, len, best_planes, mtAppl.Bitplanes, d);
END(*IF*);
ELSE
(*$?Compiler=Haenisch:
Block.Move (best_icn^.coldata, color_icn^.coldata, len);
Block.Move (best_icn^.seldata, color_icn^.seldata, len);
*)
(*$?Compiler=Megamax:
Block.Copy (best_icn^.coldata, len, color_icn^.coldata);
Block.Copy (best_icn^.seldata, len, color_icn^.seldata);
*)
END;
color_icn^.nextres := cicnblk^.color;
cicnblk^.color:= color_icn;
(* und als Userdef mit draw_cicon *)
RETURN mtXobjects.InstUserdef (ADR(obj), 0, xdraw_cicon, rs_par^.colictab);
END xadd_cicon;
(*****************************************************************************)
(* Unter TrueColor Pixelwerte der RGB-Palette ermitteln *)
(*****************************************************************************)
PROCEDURE xfill_farbtbl ();
TYPE PixArray = ARRAY [0..15] OF sINTEGER;
VAR
i, np, color: sINTEGER;
pxy : ARRAY [0..7] OF sINTEGER;
backup : ARRAY [0..31] OF sINTEGER;
rgb : ARRAY [0..2] OF sINTEGER;
pixel,
stdfm,
screen : MagicVDI.MFDB;
pixtbl : PixArray;
BEGIN
stdfm := MagicVDI.MFDB{NIL, 16, 1, 1, 1, 1, 0, 0, 0};
pixel := MagicVDI.MFDB{NIL, 16, 1, 1, 0, 1, 0, 0, 0};
pixtbl := PixArray{0, 2, 3, 6, 4, 7, 5, 8, 9, 10, 11, 14, 12, 15, 13, 16};
IF (mtAppl.Bitplanes >= 8)
THEN
IF (mtAppl.Bitplanes > 8)
THEN
IF ~is_palette (* Keine Palette in der Resource *)
THEN
FOR color := 0 TO 254 DO
IF (color < 16)
THEN
MagicVDI.InqColor (mtAppl.VDIHandle, pixtbl[color], FALSE, rgb_palette^[color]);
rgb_palette^[color][3] := pixtbl[color];
ELSE
MagicVDI.InqColor (mtAppl.VDIHandle, color-1, FALSE, rgb_palette^[color]);
rgb_palette^[color][3] := color -1;
END;
END(*FOR*);
MagicVDI.InqColor (mtAppl.VDIHandle, 1, FALSE, rgb_palette^[255]);
rgb_palette^[255][3] := 1;
is_palette := TRUE;
END;
MagicVDI.SetClipping (mtAppl.VDIHandle, pxy, FALSE);
MagicAES.GrafMouse (MagicAES.MOFF, NIL);
Block.Clear (ADR(backup), SIZE(backup));
Block.Clear (farbtbl, SIZE(farbtbl^));
screen.fdAddr := NIL;
stdfm.fdNplanes := mtAppl.Bitplanes;
pixel.fdNplanes := mtAppl.Bitplanes;
i := MagicVDI.SetWritemode (mtAppl.VDIHandle, MagicVDI.REPLACE);
MagicVDI.SetLineEndstyles (mtAppl.VDIHandle, 0, 0);
i := MagicVDI.SetLinetype (mtAppl.VDIHandle, 1);
i := MagicVDI.SetLinewidth (mtAppl.VDIHandle, 1);
Block.Clear (ADR(pxy), SIZE(pxy));
pixel.fdAddr := ADR(backup); (* Punkt retten *)
MagicVDI.CopyRasterOpaque (mtAppl.VDIHandle, 3, pxy, screen, pixel);
(* Alte Farbe retten *)
MagicVDI.InqColor (mtAppl.VDIHandle, 15, FALSE, rgb);
FOR color := 0 TO 255 DO
MagicVDI.SetColor (mtAppl.VDIHandle, 15, rgb_palette^[color]);
i := MagicVDI.SetLinecolor (mtAppl.VDIHandle, 15);
MagicVDI.Polyline (mtAppl.VDIHandle, 2, pxy);
stdfm.fdAddr := ADR(farbtbl^[color]);
pixel.fdAddr := ADR(farbtbl^[color]);
(* vro_cpyfm, weil v_get_pixel nicht mit TrueColor (>=24 Planes) funktioniert *)
MagicVDI.CopyRasterOpaque (mtAppl.VDIHandle, 3, pxy, screen, pixel);
IF xpixelbytes # 0
THEN
farbtbl2[color] := SYSTEM.BYTE(0);
(*$? Compiler=Haenisch:
Block.Move (pixel.fdAddr, ADR(farbtbl2[color]), xpixelbytes);
*)
(*$? Compiler=Megamax:
Block.Copy (pixel.fdAddr, xpixelbytes, ADR(farbtbl2[color]));
*)
END;
MagicVDI.TransformForm (mtAppl.VDIHandle, pixel, stdfm);
FOR np := 0 TO mtAppl.Bitplanes - 1 DO
IF (farbtbl^[color][np] # 0)
THEN
farbtbl^[color][np] := -1;
END(*IF*);
END(*FOR*);
END(*FOR*);
(* Alte Farbe restaurieren *)
MagicVDI.SetColor (mtAppl.VDIHandle, 15, rgb);
pixel.fdAddr := ADR(backup); (* Punkt restaurieren *)
MagicVDI.CopyRasterOpaque (mtAppl.VDIHandle, 3, pxy, pixel, screen);
MagicAES.GrafMouse (MagicAES.MON, NIL);
ELSE (* mtAppl.Bitplanes > 8 *)
IF xpixelbytes # 0
THEN
FOR color := 0 TO 255 DO
(*$? Compiler=Haenisch:
farbtbl2[color] := VAL(SYSTEM.BYTE, color);
*)
(*$? Compiler=Megamax:
farbtbl2[color] := SHORT(color);
*)
END;
END;
END;
END;
END xfill_farbtbl;
(*****************************************************************************)
(* Icon an aktuelle Grafikauflsung anpassen *)
(* (z.B. 4 Plane Icon an 24 Plane TrueColor) *)
(*****************************************************************************)
PROCEDURE xfix_cicon (col_data : ADDRESS; len : lINTEGER; old_planes, new_planes : sINTEGER; VAR s : MagicVDI.MFDB);
VAR
x, i, old_len, rest_len, (*$Reg *) pos : lINTEGER;
mul : ARRAY [0..31] OF lINTEGER;
(*$Reg*) np, mask, pixel, (*$Reg*) bit, color, maxcol : sCARDINAL;
back,
old_col : ARRAY [0..31] OF sCARDINAL;
new_data: POINTER TO sCARDINAL;
(*$Reg*) dataPtr : POINTER TO ARRAY [0..0FFFFFFH] OF sCARDINAL;
got_mem : BOOLEAN;
d : MagicVDI.MFDB;
BEGIN
got_mem := FALSE;
len := len DIV 2;
IF (old_planes = new_planes)
THEN
IF (new_planes = mtAppl.Bitplanes)
THEN
d := s;
d.fdStand := 0;
s.fdAddr := col_data;
IF (d.fdAddr = s.fdAddr)
THEN
Storage.ALLOCATE (d.fdAddr, len * 2 * VAL(lINTEGER, new_planes));
IF (d.fdAddr = NIL)
THEN
d.fdAddr := s.fdAddr;
ELSE
got_mem := TRUE;
END;
END;
MagicVDI.TransformForm (mtAppl.VDIHandle, s, d);
IF (d.fdAddr # s.fdAddr) & got_mem
THEN
(*$? Compiler=Haenisch:
Block.Move (d.fdAddr, s.fdAddr, len*2*new_planes);
*)
(*$? Compiler=Megamax:
Block.Copy (d.fdAddr, len*2*LONG(new_planes), s.fdAddr);
*)
Storage.DEALLOCATE (d.fdAddr, 0);
END;
ELSE
(*$? Compiler=Haenisch:
Block.Move (s.fdAddr, col_data, len*2*new_planes);
*)
(*$? Compiler=Megamax:
Block.Copy (s.fdAddr, len*2*LONG(new_planes), col_data);
*)
END;
RETURN;
END; (* IF old_planes = new_planes *)
old_len := VAL(lINTEGER, old_planes) * len;
rest_len := VAL(lINTEGER, new_planes) * len - old_len;
IF (new_planes <= 8)
THEN
dataPtr := s.fdAddr;
new_data := ADR(dataPtr^[old_len]);
Block.Clear (new_data, rest_len*2);
(*$? Compiler=Haenisch:
Block.Move (col_data, s.fdAddr, old_len*2);
*)
(*$? Compiler=Megamax:
Block.Copy (col_data, old_len*2, s.fdAddr);
*)
col_data := s.fdAddr;
FOR x := 0 TO len -1 DO
mask := 0FFFFH;
i := 0;
dataPtr := col_data;
WHILE i < old_len DO
mask := sCARDINAL(sBITSET(mask) * sBITSET(dataPtr^[x+i]));
INC (i, len);
END;
IF mask # 0
THEN
i := 0;
dataPtr := ADDRESS(new_data);
WHILE i < rest_len DO
dataPtr^[x+i] := sCARDINAL(sBITSET(mask)+sBITSET(dataPtr^[x+1]));
INC (i, len);
END;
END;
END;
(* ins gerteabhngige Format konvertieren *)
d := s;
d.fdStand := 0;
Storage.ALLOCATE (d.fdAddr, len * 2 * VAL(lINTEGER, new_planes));
IF d.fdAddr = NIL
THEN
d.fdAddr := s.fdAddr;
END;
MagicVDI.TransformForm (mtAppl.VDIHandle, s, d);
IF d.fdAddr # s.fdAddr
THEN
(*$? Compiler=Haenisch:
Block.Move (d.fdAddr, s.fdAddr, len*2*new_planes);
*)
(*$? Compiler=Megamax:
Block.Copy (d.fdAddr, len*2*LONG(new_planes), s.fdAddr);
*)
Storage.DEALLOCATE (d.fdAddr, 0);
END;
ELSE (* TrueColor, bzw RGB-orientierte Pixelwerte *)
IF (xpixelbytes = 0)
THEN
FOR i := 0 TO VAL(lINTEGER, new_planes) -1 DO
mul[i] := i * len;
END;
IF (old_planes < 8)
THEN
maxcol := SHIFT (1, old_planes) - 1;
(*$? Compiler=Haenisch:
Block.Move (ADR(farbtbl^[maxcol]), ADR(old_col), new_planes * TSIZE (sCARDINAL));
*)
(*$? Compiler=Megamax:
Block.Copy (ADR(farbtbl^[maxcol]), new_planes * TSIZE (sCARDINAL), ADR(old_col) );
*)
Block.Clear (ADR(farbtbl^[maxcol]), new_planes * TSIZE (sCARDINAL));
END;
dataPtr := s.fdAddr;
new_data := ADR(dataPtr^[old_len]);
Block.Clear (new_data, rest_len * 2);
(*$? Compiler=Haenisch:
Block.Move(col_data, s.fdAddr, old_len*2);
*)
(*$? Compiler=Megamax:
Block.Copy (col_data, old_len*2, s.fdAddr);
*)
col_data := s.fdAddr;
FOR x := 0 TO len -1 DO
bit := 1;
dataPtr := col_data;
FOR np := 0 TO sCARDINAL(old_planes) -1 DO
back[np] := dataPtr^[mul[np] + x];
END;
FOR pixel := 0 TO 15 DO
color := 0;
FOR np := 0 TO sCARDINAL(old_planes) -1 DO
IF ODD(back[np])
THEN
color := color + sCARDINAL(SHIFT (1, np));
END;
back[np] := back[np] DIV 2;
END;
FOR np := 0 TO sCARDINAL(new_planes) - 1 DO
pos := mul[np] + x;
(*$? Compiler = Megamax:
dataPtr^[pos] := sCARDINAL((sBITSET(dataPtr^[pos]) * SYSTEM.CAST(sBITSET, 0FFFFH-bit)) +
*)
(*$? Compiler = Haenisch:
dataPtr^[pos] := sCARDINAL((sBITSET(dataPtr^[pos]) * VAL(sBITSET, 0FFFFH-bit)) +
*)
(sBITSET(farbtbl^[color, np]) * sBITSET(bit)));
END;
bit := bit*2;
END;
END; (* FOR x := 0 TO ... *)
IF (old_planes < 8)
THEN
(*$? Compiler=Haenisch:
Block.Move (ADR(old_col), ADR(farbtbl^[maxcol]), new_planes*TSIZE (sCARDINAL));
*)
(*$? Compiler=Megamax:
Block.Copy (ADR(old_col), new_planes*TSIZE (sCARDINAL), ADR(farbtbl^[maxcol]));
*)
END;
(* ins gerteabhngige Format konvertieren *)
d := s;
d.fdStand := 0;
Storage.ALLOCATE (d.fdAddr, len * 2 * VAL(lINTEGER, new_planes));
IF d.fdAddr = NIL
THEN
d.fdAddr := s.fdAddr;
END;
MagicVDI.TransformForm (mtAppl.VDIHandle, s, d);
IF (d.fdAddr # s.fdAddr)
THEN
(*$? Compiler=Haenisch:
Block.Move(d.fdAddr, s.fdAddr, len*2*new_planes);
*)
(*$? Compiler=Megamax:
Block.Copy(d.fdAddr, len*2*LONG(new_planes), s.fdAddr);
*)
Storage.DEALLOCATE (d.fdAddr, 0);
END;
ELSE (* IF xpixelbytes = 0 *)
std_to_byte (col_data, len, old_planes, ADR(farbtbl2), s);
END;
END;
END xfix_cicon;
(*****************************************************************************)
(* std_to_byte wandelt eine Grafik im Standardformat direkt ins gerte- *)
(* abhngige Format (in Auflsungen mit >= 16 Planes) *)
(*****************************************************************************)
PROCEDURE std_to_byte (col_data : ADDRESS; len : lINTEGER; old_planes : sINTEGER; farbtbl2 : tplInt; s : MagicVDI.MFDB);
VAR
x, i, pos : lINTEGER;
mul : ARRAY [0..31] OF lINTEGER;
np, pixel, color : sCARDINAL;
new_data : POINTER TO sCARDINAL;
back : ARRAY [0..31] OF sCARDINAL;
memflag : BOOLEAN;
p1, p2 : POINTER TO SYSTEM.BYTE;
colback : lCARDINAL;
lptr,
f_tbl : POINTER TO ARRAY [0..0FFFFFFFH] OF lCARDINAL;
dataPtr : POINTER TO ARRAY [0..0FFFFFFH] OF sCARDINAL;
tmp : sBITSET;
BEGIN
memflag := FALSE;
IF (s.fdAddr = col_data)
THEN
Storage.ALLOCATE (col_data, len * 2 * VAL(lINTEGER, s.fdNplanes));
IF (col_data = NIL)
THEN
RETURN;
END;
(*$? Compiler=Haenisch:
Block.Move(s.fdAddr, col_data, len*2*s.fdNplanes);
*)
(*$? Compiler=Megamax:
Block.Copy(s.fdAddr, len*2*LONG(s.fdNplanes), col_data);
*)
memflag := TRUE;
END;
new_data := s.fdAddr;
p1 := ADDRESS(new_data);
IF (old_planes < 8)
THEN
f_tbl := ADDRESS(farbtbl2);
colback := f_tbl^[ SHIFT(1, old_planes) - 1];
f_tbl^[SHIFT(1, old_planes) - 1] := f_tbl^[255];
END;
FOR i := 0 TO VAL(lINTEGER, old_planes) -1 DO
mul[i] := i * len;
END;
pos := 0;
FOR x := 0 TO len-1 DO
dataPtr := col_data;
FOR np := 0 TO sCARDINAL(old_planes)-1 DO
back[np] := dataPtr^[mul[np] + x];
END;
FOR pixel := 0 TO 15 DO
color := 0;
FOR np := 0 TO sCARDINAL(old_planes)-1 DO
color := sCARDINAL(sBITSET(color) + sBITSET(SHIFT(sCARDINAL(sBITSET (back[np]) * sBITSET(08000H)), np - 15)));
back[np] := back[np] * 2;
END;
f_tbl := ADDRESS(farbtbl2);
CASE xpixelbytes OF
2:
dataPtr := ADDRESS(new_data);
dataPtr^[pos] := VAL(sCARDINAL, f_tbl^[color]);
INC (pos); |
3:
p2 := ADR(f_tbl^[color]);
(*
p2 := (UBYTE * )&farbtbl2[color];
*)
FOR i := 0 TO 2 DO
p1^ := p2^; INC (p1); INC (p2);
END;
|
4:
lptr := ADDRESS(new_data);
lptr^[pos] := f_tbl^[color];
INC (pos);
ELSE
END;
END; (* FOR pixel *)
END; (* FOR x *)
IF (old_planes < 8)
THEN
f_tbl := ADDRESS(farbtbl2);
f_tbl^[SHIFT(1, old_planes) - 1] := colback;
END;
IF memflag
THEN
Storage.DEALLOCATE (col_data, 0);
END;
END std_to_byte;
(*****************************************************************************)
(* Zeichnet Farb-Icon *)
(*****************************************************************************)
(*$?Compiler=Haenisch: (*$E+ $K+*) *)
PROCEDURE xdraw_cicon (pb : MagicAES.PtrPARMBLK) : sBITSET;
VAR
ob_x, ob_y, x, y,
dummy, m_mode,
i_mode, mskcol,
icncol : sINTEGER;
pxy : ARRAY[0..4] OF sINTEGER;
ob_spec : lCARDINAL;
iconblk : MagicAES.PtrICONBLK;
cicn : MagicAES.PtrCICON;
mask, data, dark : ADDRESS;
letter : ARRAY[0..1] OF CHAR;
selected : BOOLEAN;
buf : sINTEGER;
mindex, iindex : ARRAY[0..1] OF sINTEGER;
invert : BOOLEAN;
pRect : POINTER TO mtUtils.tRect;
Rect : mtUtils.tRect;
BEGIN
invert := FALSE;
mask := NIL;
data := NIL;
dark := NIL;
(*$?Compiler=Haenisch:
selected := MagicAES.SELECTED IN pb^.pbCurrstate; (* SE hat Namen korrigiert *)
*)
(*$?Compiler=Megamax:
selected := MagicAES.SELECTED IN pb^.prCurrstate;
*)
pRect := SYSTEM.ADR(pb^.pbXc);
Rect := pRect^;
mtUtils.AbsRect(Rect);
MagicVDI.SetClipping(mtAppl.VDIHandle, Rect, TRUE); (* Setze Rechteckausschnitt *)
WITH pb^ DO
ob_spec := pbParm;
ob_x := pbX;
ob_y := pbY;
END;
iconblk := MagicAES.PtrICONBLK(ob_spec);
(*$? Compiler=Megamax: (*$A+*) *)
cicn := MagicAES.PtrCICONBLK(ob_spec)^.color;
(*$? Compiler=Megamax: (*$A=*) *)
m_mode := MagicVDI.TRANSPARENT;
IF selected (* it was an objc_change *)
THEN
IF (cicn^.seldata # NIL)
THEN
mask := cicn^.selmask;
data := cicn^.seldata;
IF (cicn^.numplanes > 1)
THEN
IF (cicn^.numplanes > 8) (* TrueColor, bzw RGB-orientierte Grafikkarte? *)
THEN
i_mode := MagicVDI.S_AND_D;
ELSE
i_mode := MagicVDI.S_OR_D;
END;
ELSE
i_mode := MagicVDI.TRANSPARENT;
END;
ELSE
mask := cicn^.colmask;
data := cicn^.coldata;
IF (cicn^.numplanes > 1)
THEN
IF (cicn^.numplanes > 8)
THEN
i_mode := MagicVDI.S_AND_D;
ELSE
i_mode := MagicVDI.S_OR_D;
END;
dark := cicn^.selmask;
ELSE
invert := TRUE;
END;
END;
ELSE
mask := cicn^.colmask;
data := cicn^.coldata;
IF (cicn^.numplanes > 1)
THEN
IF (cicn^.numplanes > 8)
THEN
i_mode := MagicVDI.S_AND_D;
ELSE
i_mode := MagicVDI.S_OR_D;
END;
ELSE
i_mode := MagicVDI.TRANSPARENT;
END;
END;
WITH iconblk^ DO
IF sBITSET(ibChar) * sBITSET(00F00H) = sBITSET(00100H)
THEN
mindex[0] := SHIFT(sINTEGER(sBITSET(ibChar) * sBITSET(00F00H)), -8);
ELSE
mindex[0] := 0;
END;
mindex [1] := 0;
icncol := SHIFT(sINTEGER(sBITSET(ibChar) * sBITSET(0F000H)), -12);
iindex[0] := icncol;
iindex[1] := MagicAES.WHITE;
mskcol := SHIFT(sINTEGER(sBITSET(ibChar) * sBITSET(00F00H)), -8);
x := ob_x + ibXicon;
y := ob_y + ibYicon;
IF (invert)
THEN
buf := iindex[0];
iindex[0] := mindex[0];
mindex[0] := buf;
i_mode := MagicVDI.TRANSPARENT;
END;
IF (selected)
THEN
buf := icncol;
icncol := mskcol;
mskcol := buf;
END;
draw_bitblk (mask, x, y, ibWicon, ibHicon, 1, m_mode, mindex);
draw_bitblk (data, x, y, ibWicon, ibHicon, cicn^.numplanes, i_mode, iindex);
IF (dark # NIL)
THEN
mindex [0] := MagicAES.BLACK;
mindex [1] := MagicAES.WHITE;
draw_bitblk (dark, x, y, ibWicon, ibHicon, 1, MagicVDI.TRANSPARENT, mindex);
END;
IF (ibPtext^[0] # 0C)
THEN
x := ob_x + ibXtext;
y := ob_y + ibYtext;
pxy[0] := x;
pxy[1] := y;
pxy[2] := x + ibWtext - 1;
pxy[3] := y + ibHtext - 1;
void.I := MagicVDI.SetWritemode (mtAppl.VDIHandle, MagicVDI.REPLACE); (* Textbox zeichnen *)
void.I := MagicVDI.SetFillcolor (mtAppl.VDIHandle, mskcol);
void.I := MagicVDI.SetFillinterior (mtAppl.VDIHandle, MagicVDI.Full);
void.O := MagicVDI.SetFillperimeter(mtAppl.VDIHandle, FALSE);
MagicVDI.Bar (mtAppl.VDIHandle, pxy);
END;
void.I := MagicVDI.SetWritemode(mtAppl.VDIHandle, MagicVDI.TRANSPARENT);
void.I := MagicVDI.SetTextface(mtAppl.VDIHandle, 1); (* Systemfont *)
MagicVDI.SetCharheight(mtAppl.VDIHandle, 4, dummy, dummy, dummy, dummy);
void.I := MagicVDI.SetTextcolor(mtAppl.VDIHandle, icncol);
void.B := MagicVDI.SetTexteffect(mtAppl.VDIHandle, sBITSET{});
MagicVDI.SetTextalignment(mtAppl.VDIHandle, MagicVDI.LeftJust, MagicVDI.TopJust, dummy, dummy);
void.I := MagicVDI.SetCharbaseline(mtAppl.VDIHandle, 0);
(*$?Compiler=Megamax: (*$A+*) *)
IF MagicAES.PtrSTRING(iconblk^.ibPtext)^[0] # 0C
THEN
(*$?Compiler=Megamax: (*$A=*) *)
x := x + (ibWtext - VAL(sINTEGER, LENGTH(ibPtext^)) * 6) DIV 2;
y := y + (ibHtext - 6) DIV 2;
MagicVDI.Text (mtAppl.VDIHandle, x, y, ibPtext^);
END;
letter[0] := CHR(iconblk^.ibChar MOD 256);
IF (letter[0] # 0C)
THEN
letter[1] := 0C;
x := ob_x + ibXicon + ibXchar;
y := ob_y + ibYicon + ibYchar;
MagicVDI.Text (mtAppl.VDIHandle, x, y, letter);
END;
END; (* WITH iconblk^ *)
MagicVDI.SetClipping(mtAppl.VDIHandle, Rect, FALSE); (* und wieder aus *)
(*$?Compiler=Haenisch:
RETURN (pb^.pbCurrstate - sBITSET{MagicAES.SELECTED}); (* SE hat Namen korrigiert *)
*)
(*$?Compiler=Megamax:
RETURN (pb^.prCurrstate - sBITSET{MagicAES.SELECTED});
*)
END xdraw_cicon;
(*$?Compiler=Haenisch: (*$E= $K=*) *)
PROCEDURE draw_bitblk (p : ADDRESS; x, y, w, h : sINTEGER; num_planes : sINTEGER; mode : sINTEGER; VAR index : ARRAY OF sINTEGER);
VAR pxy : ARRAY[0..7] OF sINTEGER;
s, d : MagicVDI.MFDB;
BEGIN
d.fdAddr := NIL; (* screen *)
WITH s DO
fdAddr := p;
fdW := w;
fdH := h;
fdWdwidth := w DIV 16;
fdStand := 0;
fdNplanes := num_planes;
END;
pxy[0] := 0;
pxy[1] := 0;
pxy[2] := s.fdW - 1;
pxy[3] := s.fdH - 1;
pxy[4] := x;
pxy[5] := y;
pxy[6] := pxy[4] + pxy [2];
pxy[7] := pxy[5] + pxy [3];
IF (num_planes > 1)
THEN
MagicVDI.CopyRasterOpaque(mtAppl.VDIHandle, mode, pxy, s, d);
ELSE
MagicVDI.CopyRasterTransparent(mtAppl.VDIHandle, mode, index[0], index[1], pxy, s, d); (* copy it *)
END;
END draw_bitblk;
(*****************************************************************************)
(* Farbicons fr aktuelle Auflsung initialisieren *)
(*****************************************************************************)
PROCEDURE do_ciconfix (header : SYSTEM.ADDRESS; rsxhdr : tpRSXHDR; rs_len : lCARDINAL);
PROCEDURE test_rez (): sINTEGER;
TYPE rgbArray = ARRAY [0..2] OF sINTEGER;
VAR
i, np, color, bpp: sINTEGER;
pxy : ARRAY [0..7] OF sINTEGER;
black,
white,
rgb : rgbArray;
test,
backup : ARRAY [0..31] OF sCARDINAL;
pixel,
stdfm,
screen : MagicVDI.MFDB;
BEGIN
pixel := MagicVDI.MFDB {NIL, 16, 1, 1, 0, 1, 0, 0, 0};
stdfm := MagicVDI.MFDB {NIL, 16, 1, 1, 1, 1, 0, 0, 0};
white := rgbArray{1000, 1000, 1000};
black := rgbArray{0, 0, 0};
bpp := 0;
IF (mtAppl.Bitplanes >= 8)
THEN
stdfm.fdNplanes := mtAppl.Bitplanes;
pixel.fdNplanes := mtAppl.Bitplanes;
IF (mtAppl.Bitplanes = 8)
THEN
color := 0FFH;
Block.Clear (ADR (test), SIZE(test));
FOR np := 0 TO mtAppl.Bitplanes - 1 DO
test[np] := SHIFT(SHIFT(1, np) , 15-np);
END;
pixel.fdAddr := ADR(test);
stdfm.fdAddr := ADR(test);
MagicVDI.TransformForm (mtAppl.VDIHandle, stdfm, pixel);
i := 1;
WHILE (i < mtAppl.Bitplanes) & (test[i] # 0) DO
INC (i);
END;
IF (i >= mtAppl.Bitplanes) & ~(test[0] MOD 00FFH = 0)
THEN
bpp := 1;
END;
ELSE
MagicVDI.SetClipping (mtAppl.VDIHandle, pxy, FALSE);
screen.fdAddr := NIL;
Block.Clear (ADR(backup), SIZE (backup));
i := MagicVDI.SetWritemode (mtAppl.VDIHandle, MagicVDI.REPLACE);
MagicVDI.SetLineEndstyles (mtAppl.VDIHandle, 0, 0);
i := MagicVDI.SetLinetype (mtAppl.VDIHandle, 1);
i := MagicVDI.SetLinewidth (mtAppl.VDIHandle, 1);
Block.Clear (ADR(pxy), SIZE (pxy));
MagicAES.GrafMouse (MagicAES.MOFF, NIL);
pixel.fdAddr := ADR(backup); (* Punkt retten *)
MagicVDI.CopyRasterOpaque (mtAppl.VDIHandle, 3, pxy, screen, pixel);
(* Alte Farbe retten *)
MagicVDI.InqColor (mtAppl.VDIHandle, 15, FALSE, rgb);
(* Gerteabhngiges Format testen *)
pixel.fdAddr := ADR(test);
i := MagicVDI.SetLinecolor (mtAppl.VDIHandle, 15);
MagicVDI.SetColor (mtAppl.VDIHandle, 15, white);
MagicVDI.Polyline (mtAppl.VDIHandle, 2, pxy);
Block.Clear (ADR(test), SIZE(test));
MagicVDI.CopyRasterOpaque (mtAppl.VDIHandle, 3, pxy, screen, pixel);
i := (mtAppl.Bitplanes + 15) DIV 16 * 2;
WHILE (i < mtAppl.Bitplanes) & (test[i] # 0) DO INC (i); END;
IF (i >= mtAppl.Bitplanes)
THEN
MagicVDI.SetColor (mtAppl.VDIHandle, 15, black);
MagicVDI.Polyline (mtAppl.VDIHandle, 2, pxy);
Block.Clear (ADR(test), SIZE(test));
MagicVDI.CopyRasterOpaque (mtAppl.VDIHandle, 3, pxy, screen, pixel);
i := (mtAppl.Bitplanes + 15) DIV 16 * 2;
WHILE (i < mtAppl.Bitplanes) & (test[i] # 0) DO INC (i); END;
IF (i >= mtAppl.Bitplanes)
THEN
bpp := (mtAppl.Bitplanes + 7) DIV 8;
END;
END;
(* Alte Farbe restaurieren *)
MagicVDI.SetColor (mtAppl.VDIHandle, 15, rgb);
pixel.fdAddr := ADR(backup); (* Punkt restaurieren *)
MagicVDI.CopyRasterOpaque (mtAppl.VDIHandle, 3, pxy, pixel, screen);
MagicAES.GrafMouse (MagicAES.MON, NIL);
MagicVDI.SetClipping (mtAppl.VDIHandle, pxy, TRUE);
END;
END;
RETURN bpp;
END test_rez;
VAR cicon_liste : SYSTEM.ADDRESS;
(*$Reg*) i : sINTEGER;
obj : mtUtils.tObjcTree;
nub : sINTEGER;
palette : POINTER TO sINTEGER;
ExtSlot : tpExtSlot;
BEGIN
ExtSlot := header + rsxhdr^.rshRssize;
IF ODD(lCARDINAL(ExtSlot))
THEN
ExtSlot := ExtSlot + SYSTEM.ADDRESS(1);
END;
cicon_liste := header + ExtSlot^.rscCIconTab;
obj := mtUtils.tObjcTree(rsxhdr^.rshObject + header);
IF (lCARDINAL(cicon_liste - header) > rsxhdr^.rshRssize)
AND (lCARDINAL(cicon_liste - header) < rs_len)
THEN
IF (fill_cicon_liste (cicon_liste, header, rsxhdr) # 0)
THEN
nub := 0;
IF (rs_par^.colictab # NIL)
THEN
xpixelbytes := test_rez ();
(* haben wir noch keine Tabelle? Dann allozieren *)
IF (rgb_palette = NIL)
THEN
Storage.ALLOCATE(rgb_palette, SIZE(rgb_palette^));
END;
IF (farbtbl = NIL)
THEN
Storage.ALLOCATE(farbtbl, SIZE(farbtbl^));
END;
IF (ExtSlot^.rscFarbtbl = 1 )
THEN
palette := header + ExtSlot^.rscFarbtbl;
(*$? Compiler=Haenisch:
Block.Move(palette, rgb_palette, SIZE(rgb_palette));
*)
(*$? Compiler=Megamax:
Block.Copy(palette, SIZE(rgb_palette), rgb_palette);
*)
is_palette := TRUE;
ELSE
is_palette := FALSE;
END;
xfill_farbtbl ();
FOR i := 0 TO VAL(sINTEGER, rsxhdr^.rshNobs) - 1 DO
IF ((obj^[i].obType MOD 256) = MagicAES.GCICON)
THEN
IF ~xadd_cicon (obj^[i].obSpec.CiconPtr, obj^[i], nub)
THEN
Block.Clear(SYSTEM.ADR(rs_par^.colictab^[nub]), SYSTEM.TSIZE(MagicAES.CICON));
obj^[i].obType := (obj^[i].obType DIV 256 * 256) + MagicAES.GICON;
END;
INC(nub);
obj^[i].obSpec.address := obj^[i].obSpec.address - header;
END;
END; (* FOR *)
ELSE
FOR i := 0 TO VAL(sINTEGER, rsxhdr^.rshNobs) - 1 DO
IF ((obj^[i].obType MOD 256) = MagicAES.GCICON)
THEN
obj^[i].obType := (obj^[i].obType DIV 256 * 256) + MagicAES.GICON;
obj^[i].obSpec.address := obj^[i].obSpec.address - header;
END;
END;
END;
END; (* IF fill_iconliste *)
END; (* cicon_liste - header > ... *)
END do_ciconfix;
PROCEDURE xrsrc_reloc ( Adr : SYSTEM.ADDRESS;
length : lCARDINAL;
VAR pglobal : tRsBuffer) : BOOLEAN;
VAR i : sINTEGER;
ret : BOOLEAN;
BEGIN
ret := TRUE;
rs_par := SYSTEM.ADR(pglobal);
IF (length > SYSTEM.TSIZE(MagicTypes.RSHDR))
THEN
(* Speicher fr den Header *)
Storage.ALLOCATE(rs_par^.xhdr, SYSTEM.TSIZE(RSXHDR));
IF rs_par^.xhdr # NIL
THEN
rs_par^.rscdata := Adr;
IF rs_par^.rscdata^.rshVrsn = 3
THEN
(*$? Compiler=Haenisch:
Block.Move(rs_par^.rscdata, rs_par^.xhdr, SYSTEM.TSIZE(RSXHDR));
*)
(*$? Compiler=Megamax:
Block.Copy(rs_par^.rscdata, SYSTEM.TSIZE(RSXHDR), rs_par^.xhdr);
*)
ELSE
FOR i := 0 TO (SYSTEM.TSIZE(RSXHDR) DIV SYSTEM.TSIZE(lINTEGER)) - 1 DO
(*$?Compiler=Megamax: (*$A+*) *)
tplCard(rs_par^.xhdr)^[i] := tpsCard(rs_par^.rscdata)^[i];
(*$?Compiler=Megamax: (*$A=*) *)
END;
END;
do_rsfix (rs_par^.xhdr^.rshRssize);
IF (length > rs_par^.xhdr^.rshRssize + 72) (* Farbicons in der Resource? *)
THEN
do_ciconfix (rs_par^.rscdata, rs_par^.xhdr, length);
END;
ELSE
ret := FALSE;
END;
ELSE
ret := FALSE;
END;
IF ret
THEN
rs_fixindex (pglobal);
END;
RETURN ret;
END xrsrc_reloc;
(*$? Compiler = Haenisch:
PROCEDURE rs_read (VAR global : tRsBuffer; VAR fname : STRING) : BOOLEAN;
*)
(*$? Compiler = Megamax:
PROCEDURE rs_read (VAR global : tRsBuffer; REF fname : ARRAY OF CHAR) : BOOLEAN;
*)
VAR i, fh : sINTEGER;
tmpnam : ARRAY[0..256] OF CHAR;
dta : MagicDOS.DTA;
old_dta : POINTER TO MagicDOS.DTA;
read, size : lCARDINAL;
ret : BOOLEAN;
BEGIN
ret := TRUE; (* Annahme ok *)
MagicStrings.Assign(fname, tmpnam);
MagicAES.ShelFind(tmpnam);
rs_par := SYSTEM.ADR(global);
old_dta := MagicDOS.Fgetdta ();
MagicDOS.Fsetdta(SYSTEM.ADR(dta));
(* Warum hier ber Fsfirst?
* Wohl nur, um die Dateigre zu bekommen.
*)
IF MagicDOS.Fsfirst (tmpnam, sBITSET{Bit4}) = 0
THEN
size := dta.dLength;
ELSE
size := 0;
END;
MagicDOS.Fsetdta (old_dta);
IF (size > SYSTEM.TSIZE (MagicTypes.RSHDR))
THEN
fh := MagicDOS.Fopen (tmpnam, {});
IF fh > 0
THEN
Storage.ALLOCATE(rs_par^.xhdr, size + SYSTEM.TSIZE(RSXHDR));
IF rs_par^.xhdr # NIL
THEN
rs_par^.rscdata := rs_par^.xhdr + SYSTEM.ADDRESS(SYSTEM.TSIZE(RSXHDR));
read := size;
MagicDOS.Fread (fh, read, rs_par^.rscdata);
IF read = size
THEN
IF rs_par^.rscdata^.rshVrsn = 3
THEN
(*$? Compiler=Haenisch:
Block.Move(rs_par^.rscdata, rs_par^.xhdr, SYSTEM.TSIZE(RSXHDR));
*)
(*$? Compiler=Megamax:
Block.Copy(rs_par^.rscdata, SYSTEM.TSIZE(RSXHDR), rs_par^.xhdr);
*)
ELSE
FOR i := 0 TO SYSTEM.TSIZE(RSXHDR) DIV SYSTEM.TSIZE(lINTEGER) - 1 DO
(*$? Compiler=Megamax: (*$A+*) *)
tplCard(rs_par^.xhdr)^[i] := tpsCard(rs_par^.rscdata)^[i];
(*$? Compiler=Megamax: (*$A=*) *)
END;
END;
do_rsfix (rs_par^.xhdr^.rshRssize);
IF (size > rs_par^.xhdr^.rshRssize + 72) (* Farbicons in der Resource? *)
THEN
do_ciconfix (rs_par^.rscdata, rs_par^.xhdr, size);
END;
ELSE
ret := FALSE;
END;
ELSE
ret := FALSE;
END;
void.I := MagicDOS.Fclose (fh);
ELSE
ret := FALSE;
END;
ELSE
ret := FALSE;
END;
RETURN ret;
END rs_read;
PROCEDURE NewRsc (): RESOURCE;
VAR new : RESOURCE;
BEGIN
Storage.ALLOCATE (new, SYSTEM.TSIZE(Resource));
IF new # NIL
THEN
(* sicherheitshalber lschen *)
Block.Clear(new, SYSTEM.TSIZE(Resource));
new^.last := NIL;
IF RscList # NIL
THEN
RscList^.last := new; (* rckwarts verketten *)
END;
new^.next:= RscList;
RscList := new;
END;
RETURN new;
END NewRsc;
(*-------------------------------------------------------------------------*)
(*- -*)
(*- exportierte Funktionen -*)
(*- -*)
(*-------------------------------------------------------------------------*)
PROCEDURE RelocRsc (address: SYSTEM.ADDRESS; VAR rsc: RESOURCE): BOOLEAN;
VAR length : lCARDINAL;
pRsc : POINTER TO MagicTypes.RSHDR;
pXRsc : tpRSXHDR;
pLC : POINTER TO lCARDINAL;
BEGIN
pRsc := address;
pXRsc := address;
IF sBITSET{Bit1, Bit0} * sBITSET{pRsc^.rshVrsn} = sBITSET{Bit1, Bit0}
THEN
length := pXRsc^.rshRssize;
ELSE
length := pRsc^.rshRssize;
END;
IF Bit2 IN sBITSET(pRsc^.rshVrsn) (* Bit 2 markiert Erweiterungsslot *)
THEN
pLC := address + SYSTEM.ADDRESS(length);
IF pLC^ # 0 (* Ist das der Erweiterungsslot? *)
THEN
(* Dort steht die Gesamtlnge der Daten *)
length := pLC^;
END;
END;
rsc:= NewRsc ();
IF (rsc # NIL)
AND xrsrc_reloc(address, length, rsc^.RsBuffer)
THEN
RETURN TRUE;
ELSE
IF rsc # NIL
THEN
Storage.DEALLOCATE(rsc, 0); (* wieder freigeben *)
END;
RETURN FALSE;
END;
END RelocRsc;
(*$? Compiler = Haenisch:
PROCEDURE LoadRsc (VAR name: STRING; VAR rsc: RESOURCE): BOOLEAN;
*)
(*$? Compiler = Megamax:
PROCEDURE LoadRsc (REF name: ARRAY OF CHAR ; VAR rsc: RESOURCE): BOOLEAN;
*)
BEGIN
rsc:= NewRsc ();
IF (rsc # NIL)
AND rs_read (rsc^.RsBuffer, name)
THEN
rs_fixindex (rsc^.RsBuffer);
RETURN TRUE;
ELSE
IF rsc # NIL
THEN
Storage.DEALLOCATE(rsc, 0); (* wieder freigeben *)
END;
RETURN FALSE;
END;
END LoadRsc;
PROCEDURE FreeRsc (VAR rsc: RESOURCE);
VAR count1, count2 : sCARDINAL;
BEGIN
IF rsc # NIL
THEN
IF rsc^.RsBuffer.colictab # NIL
THEN
FOR count1 := 0 TO rsc^.RsBuffer.colicons - 1 DO
WITH rsc^.RsBuffer.colictab^[count1] DO
IF (numplanes > 1)
THEN
IF (coldata # NIL)
THEN
Storage.DEALLOCATE(coldata, 0);
END;
IF (seldata # NIL)
THEN
Storage.DEALLOCATE(seldata, 0);
END;
IF (seldata = NIL) AND (selmask # NIL)
THEN
Storage.DEALLOCATE(selmask, 0);
END;
END;
END;
END;
(* Die noch belegten Userdefs freigeben *)
WITH rsc^.RsBuffer DO
FOR count1 := 0 TO VAL(sCARDINAL, xhdr^.rshNtree) - 1 DO
count2 := 0;
LOOP
IF tree^[count1]^[count2].obType MOD 256 = MagicAES.GPROGDEF
THEN
mtXobjects.FreeUserdef(tree^[count1], count2);
END;
IF MagicAES.LASTOB IN tree^[count1]^[count2].obFlags
THEN
EXIT;
END;
INC(count2);
END; (* LOOP *)
END; (* FOR *)
END; (* WITH *)
END;
Storage.DEALLOCATE(rsc^.RsBuffer.colictab, 0);
Storage.DEALLOCATE(rsc^.RsBuffer.xhdr, 0);
IF rsc^.last # NIL
THEN
rsc^.last^.next:= rsc^.next;
ELSE
RscList:= rsc^.next;
END;
Storage.DEALLOCATE (rsc, 0);
END;
END FreeRsc;
PROCEDURE FreeAll;
BEGIN
WHILE RscList # NIL DO
FreeRsc(RscList);
END;
RscList:= NIL;
END FreeAll;
PROCEDURE GaddrRsc (rsc: RESOURCE; type, item: sINTEGER): SYSTEM.ADDRESS;
VAR adr : SYSTEM.ADDRESS;
BEGIN
IF rsc # NIL
THEN
rs_par := SYSTEM.ADR(rsc^.RsBuffer);
RETURN get_address (type, item);
ELSE
RETURN NIL;
END;
END GaddrRsc;
PROCEDURE SaddrRsc (rsc: RESOURCE; type, item: sINTEGER; tree: SYSTEM.ADDRESS);
VAR old_addr, new_addr : POINTER TO MagicAES.OBJECT;
BEGIN
IF rsc # NIL
THEN
rs_par := SYSTEM.ADR(rsc^.RsBuffer);
old_addr := get_address (type, item);
IF old_addr # NIL
THEN
new_addr := tree;
old_addr^ := new_addr^;
END;
END;
END SaddrRsc;
PROCEDURE ObfixRsc (rsc: RESOURCE; tree: SYSTEM.ADDRESS; object: sINTEGER);
BEGIN
IF rsc # NIL
THEN
rs_obfix (tree, object);
END;
END ObfixRsc;
PROCEDURE GetRscHeader (rsc: RESOURCE; VAR hdr: RSXHDR);
(* Liefert den RscHeader im langen Format *)
BEGIN
hdr := rsc^.RsBuffer.xhdr^;
END GetRscHeader;
VAR Init : sCARDINAL;
PROCEDURE InitMtRsc();
BEGIN
IF Init # 30961
THEN
xgl_wbox := mtAppl.CharWidth;
xgl_hbox := mtAppl.CharHeight;
rgb_palette := NIL;
farbtbl := NIL;
Init := 30961;
RscList:= NIL;
mtAppl.InstallTermproc (FreeAll);
END;
END InitMtRsc;
BEGIN
(* Init := 0;*)
InitMtRsc();
END mtRsc.